#ifndef WINSOCK_H
#define WINSOCK_H

#include "windows.h"
/*#include "netlib:include.h.errno"*/
#include "errno.h"
#include <ctype.h>
#include "unistd.h"

#include "sys/types.h"
/*#include "sys/byteorder.h"*/
#include "arpa/inet.h"
#include "sys/socket.h"
#include "sys/errno.h"
#include "sys/ioctl.h"
#include "netdb.h"
#include "netinet/in.h"
/*#include "socklib.h"
#include "inetlib.h"
#include "unixlib.h"*/

/* defines missing from netlib that Winsock and BSD use - this
 * is dodgy... */
#ifndef HOST_NOT_FOUND
#define HOST_NOT_FOUND 11001
#define TRY_AGAIN      11002
#define NO_RECOVERY    11003
#define NO_DATA        11004
#endif
/* dummy defines for Windows event codes - these don't have an equivalent in Unix */
#define FD_READ        1
#define FD_CLOSE       2

#define SOCKET_ERROR            (-1)
#define SOCKET int
#define INVALID_SOCKET (-1)

#define WORD int
typedef struct
{
  int wVersion;
} WSADATA;


extern int WSAGetLastError(void);
extern int WSAAsyncSelect(SOCKET socket, HWND hWnd, unsigned int wMsg, long lEvent);
extern int WSAStartup(int winsockVer, WSADATA *wsadata);
#define WSACleanup()

#define closesocket close

#define HIWORD(x) (x & 0xffff0000)>>16
#define LOWORD(x) (x & 0x0000ffff)
#define WSAGETSELECTERROR(lParam)            HIWORD(lParam)

#define WSAGETSELECTEVENT(lParam)            LOWORD(lParam)

#define HIBYTE(x) ((x & 0xff00)>>8)
#define LOBYTE(x) (x & 0xff)
#define MAKEWORD(a,b) (a<<8 | b)

/* Microsoft Windows Extended data types */
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr_in *PSOCKADDR_IN;
typedef struct sockaddr_in FAR *LPSOCKADDR_IN;


#define	WSAEPERM EPERM
#define	WSAENOENT ENOENT
#define	WSAESRCH ESRCH
#define	WSAEINTR EINTR
#define	WSAEIO EIO
#define	WSAENXIO ENXIO
#define	WSAE2BIG E2BIG
#define	WSAENOEXEC ENOEXEC
#define	WSAEBADF EBADF
#define	WSAECHILD ECHILD
#define	WSAEAGAIN EAGAIN
#define	WSAENOMEM        ENOMEM
#define	WSAEACCES EACCES
#define	WSAEFAULT EFAULT
#define	WSAENOTBLK ENOTBLK
#define	WSAEBUSY EBUSY
#define	WSAEEXIST EEXIST
#define	WSAEXDEV EXDEV
#define	WSAENODEV ENODEV
#define	WSAENOTDIR ENOTDIR
#define	WSAEISDIR EISDIR
#define	WSAEINVAL EINVAL
#define	WSAENFILE ENFILE
#define	WSAEMFILE EMFILE
#define	WSAENOTTY ENOTTY
#define	WSAETXTBSY ETXTBSY
#define	WSAEFBIG EFBIG
#define	WSAENOSPC ENOSPC
#define	WSAESPIPE ESPIPE
#define	WSAEROFS EROFS
#define	WSAEMLINK EMLINK
#define	WSAEPIPE EPIPE

/* math software */
#define	WSAEDOM EDOM
#define	WSAERANGE ERANGE

/* non-blocking and interrupt i/o */
#define	WSAEWOULDBLOCK EWOULDBLOCK
#define	WSAEINPROGRESS EINPROGRESS
#define	WSAEALREADY EALREADY

/* ipc/network software */

	/* argument errors */
#define	WSAENOTSOCK ENOTSOCK
#define	WSAEDESTADDRREQ EDESTADDRREQ
#define	WSAEMSGSIZE EMSGSIZE
#define	WSAEPROTOTYPE EPROTOTYPE
#define	WSAENOPROTOOPT ENOPROTOOPT
#define	WSAEPROTONOSUPPORT EPROTONOSUPPORT
#define	WSAESOCKTNOSUPPORT ESOCKTNOSUPPORT
#define	WSAEOPNOTSUPP EOPNOTSUPP
#define	WSAEPFNOSUPPORT EPFNOSUPPORT
#define	WSAEAFNOSUPPORT EAFNOSUPPORT
#define	WSAEADDRINUSE EADDRINUSE
#define	WSAEADDRNOTAVAIL EADDRNOTAVAIL

	/* operational errors */
#define	WSAENETDOWN ENETDOWN
#define	WSAENETUNREACH ENETUNREACH
#define	WSAENETRESET ENETRESET
#define	WSAECONNABORTED ECONNABORTED
#define	WSAECONNRESET ECONNRESET
#define	WSAENOBUFS ENOBUFS
#define	WSAEISCONN EISCONN
#define	WSAENOTCONN ENOTCONN
#define	WSAESHUTDOWN ESHUTDOWN
#define	WSAETOOMANYREFS ETOOMANYREFS
#define	WSAETIMEDOUT ETIMEDOUT
#define	WSAECONNREFUSED ECONNREFUSED

	/* */
#define	WSAELOOP LOOP
#define	WSAENAMETOOLONG ENAMETOOLONG

/* should be rearranged */
#define	WSAEHOSTDOWN EHOSTDOWN
#define	WSAEHOSTUNREACH EHOSTUNREACH
#define	WSAENOTEMPTY ENOTEMPTY

/* quotas & mush */
#define	WSAEPROCLIM EPROCLIM
#define	WSAEUSERS EUSERS
#define	WSAEDQUOT EDQUOT

/* Network File System */
#define	WSAESTALE ESTALE
#define	WSAEREMOTE EREMOTE

/* SystemV Record Locking */
#define	WSAEDEADLK EDEADLK
#define	WSAENOLCK ENOLCK

/* SystemV IPC */
#define	WSAENOMSG ENOMSG
#define	WSAEIDRM EIDRM

/* Shared libraries */
#define	WSAELIBVER ELIBVER
#define	WSAELIBACC ELIBACC
#define	WSAELIBLIM ELIBLIM
#define	WSAELIBNOENT ELIBNOENT
#define	WSAELIBNOEXEC ELIBNOEXEC

#define WSAHOST_NOT_FOUND HOST_NOT_FOUND
#define WSATRY_AGAIN TRY_AGAIN
#define WSANO_DATA NO_DATA

#endif
